package de.mnit.basis.daten.typ;

import java.lang.reflect.Constructor;

import de.mnit.basis.fehler.Fehler;

/**
 * @author Michael Nitsche
 * 12.12.2010	Erstellt
 */
public class Klasse {

	public static String gName(Object o) {
		if(o==null)
			return "null";
		return gName(o instanceof Class<?> ? (Class<?>)o : o.getClass());
	}

	public static String gName(Class<?> k) {
		return k.getSimpleName();
	}

	@SuppressWarnings("unchecked")
	public static <T> T nInstanz(Class<T> klasse, Object... pars) {
		Fehler.objekt.wenn_Null(klasse, pars);
		Constructor[] cs=klasse.getConstructors();
		for(Constructor c : cs) {
			Class<?>[] cpars=c.getParameterTypes();
			if(cpars.length == pars.length) {
				boolean ok=true;
				for(int i=0; i<cpars.length; i++) {
					if(cpars[i].isInstance(pars[i]) )
						continue;
					ok=false;
					break;
				}
				if(ok)
					try {
						return (T)c.newInstance(pars);
					}
					catch(Exception e) {
						throw Fehler.zeig(e, true, "Fehler beim erzeugen der Klasse");
					}
			}
		}
		throw Fehler.sonstige.da_Untypisch("Konstruktor existiert nicht", klasse, pars, klasse.getConstructors());
	}

}
